"""
海滩上有一堆桃子，五只猴子来分。第一只猴子把这堆桃子平均分为五份，多了一个，这只猴子把多的一个扔入海中，拿走了一份。第二只猴子把剩下的桃子又平均分成五份，
又多了一个，它同样把多的一个扔入海中，拿走了一份，第三、第四、第五只猴子都是这样做的，问海滩上原来最少有多少个桃子？
"""

if __name__ == '__main__':
    i = 0  # 多少个猴子
    j = 1  # 假定第五只猴子将桃子分成五份后，拿走的一份数量为1，这个变量就是j，因为后面再来猴子也不可能再等5分了，所以这个j其实是假定最后一个猴子拿走的一份桃子数量,最后其实j也并不是1而是255,这就是问题说海滩上最少有多个猴子？
    x = 0  # 海滩上有多少个桃子
    # 采用倒推的方式进行穷举，第一次遍历是第五个猴子，下标索引为0，海滩上的桃子数为 x=4*1
    while (i < 5):
        x = 4 * j
        """
        i=0 表示第五个猴子，x 是海滩上的桃子数，当被第一个猴子扔掉一个后，可以分成等分的五份，拿走一份后还剩4份，意味着是可以对4取模的，这时可以计算出,
        这时可以计算出上一个猴子拿走一份后海滩上剩下的桃子数x -> x = (x / 4) * 5 + 1,索引数增加，其实是递归倒推到第四个猴子i+1,其实这里一直做的是穷举
        """
        for i in range(0, 5):
            print(f"第{5 - i}个猴子拿走一份{x / 4}个桃子后，海滩上还剩{x}个桃子")
            if (x % 4 != 0):  # 这里是穷举的终止条件，如果海滩上剩的桃子无法再均分4份，则穷举停掉，改变最后一个猴子拿走的一份桃子数 j 数量
                break
            else:
                i += 1
            x = (x / 4) * 5 + 1
        j += 1
    print(x)
